package main;
use strict;
use warnings;

sub onTimer($)
########################################################################################################
# Hilfsfunktion um den Timer zu steuern
# 28.06.2013 MBS
#
# Uebergabe $_[0] = eine Zahl fuer die gewuenschte Funktion
#
########################################################################################################
{
	if($_[0] eq 1)
		{
			# Lueften ('Temp,Feuchtesensor , 'Dummydevice' , 'Zielwert Feuchte')
			# Empfehlung ob gelueftet werden soll
			Lueften("Keller","dum_Keller_lueften","50");
			# Platz fuer weitere Raeume....
		}
	elsif($_[0] eq 2)
		{
			# Tatsaechliches Motor ansteuern
			fenster("Keller","Aussen","dum_Keller_lueften","AB1_Bit0","relais_AB1_Bit0","AB1_Bit1","relais_AB1_Bit1","dum_Fenster_Motor_state","dum_wait_win1","relais_wait_win1","dum_I2C_fhem_status");
			# xxxxxxx
		}
	elsif($_[0] eq 3)
		{
			# Check ob I2C Bus läuft
			I2Crun("i2c_fhem","dum_I2C_fhem_status");
		}
	elsif($_[0] eq 4)
		{
			# Berechnungen Zisterne
			Zisterne("dum_SRF10_wert");
		}
}

sub Lueften($$$)
#########################################################################################################
# Ermitteln ob gelueftet werden soll   -   Empfehlung !
# 28.06.2013 MBS
#
# Uebergabe $_[0] = Sensor Reading "fan" 
#           $_[1] = dummy device
#           $_[2] = Grenzwert stopp lueften
#
########################################################################################################
{
	if(ReadingsVal($_[0],"fan","off") eq "on")
		{
			if(ReadingsVal($_[0],"humidity",100) >= $_[2])
				{
					if (ReadingsVal($_[1],"state","NEIN") ne "JA") {fhem("set $_[1] JA")} 
				}  
			else
				{
					if (ReadingsVal($_[1],"state","NEIN") ne "EGAL") {fhem("set $_[1] EGAL")}
				}
		}
	else 
		{
			if (ReadingsVal($_[1],"state","JA") ne "NEIN") {fhem("set $_[1] NEIN")} 
		}
}

sub fenster($$$$$$$$$$$)
#######################################################################################################
# Fenster Motor Steuerung
#
# 01.07.2013 MBS
#
# Uebergabe $_[0] = Sensor Reading (Keller)
#	    $_[1] = Sensor Reading (Aussen)
#	    $_[2] = dum_Keller_luefter "state" 
#	    $_[3] = Ausgang Fenster auf
#           $_[4] = Relais Motor auf 
#	    $_[5] = Ausgang Fenster zu
#           $_[6] = Releis Motor zu
#           $_[7] = Letzter Zustand offen/geschlossen 
#	    $_[8] = Wait Windows open again
#	    $_[9] = Timer Wait Windows open again
#           $_[10] = I2C Status
#
#######################################################################################################
{
# Variablen deklarieren und befuellen
my $temp_aussen = ReadingsVal($_[1],"temperature",0);    
my $dewp_aussen = ReadingsVal($_[1],"dewpoint",0);
my $humi_aussen = ReadingsVal($_[1],"humidity",0);
#print $dewp_aussen;
my $temp_innen = ReadingsVal($_[0],"temperature",0);
my $dewp_innen = ReadingsVal($_[0],"dewpoint",0);
my $humi_innen = ReadingsVal($_[0],"humidity",0);
#print $dewp_innen;

my $dum_state = ReadingsVal($_[2],"state","NEIN");
my $dum_fenster = ReadingsVal($_[7],"state", "close");

my $dum_i2c = ReadingsVal($_[10],"state","stop");

my $wait_state = ReadingsVal($_[8],"state","off");

my $temp_aussen_min = 0;
my $temp_aussen_max = 22;
my $temp_innen_min = 18; 
my $dewp_diff = $dewp_innen - $dewp_aussen;
#print $dewp_diff;

if(($wait_state eq "off") && ($dum_i2c eq "run"))
{
	if (($temp_aussen > $temp_aussen_min) && ($temp_aussen < $temp_aussen_max))
	{
		if (($dum_state eq "JA") && ($dum_fenster eq "close") && ($temp_innen > $temp_innen_min ))
		{
			fhem("set $_[3] on; define $_[4] at +00:00:15 set $_[3] off; set $_[7] open");
			fhem("set $_[8] on; define $_[9] at +00:15:00 set $_[8] off");
		}
		elsif (($dum_state eq "NEIN") && ($dum_fenster eq "open") && (($dewp_diff > "0") && ($dewp_diff < "2" ))) 
		{
			fhem("set $_[5] on; define $_[6] at +00:00:15 set $_[5] off; set $_[7] close; define Fenster_nachlauf_ein at +00:00:25 set $_[5] on; define Fenster_nachlauf_aus at +00:00:35 set $_[5] off" );
			fhem("set $_[8] on; define $_[9] at +00:15:00 set $_[8] off");
		}
	}
}
}


sub DebianMail
##########################################################################################################################
#
# Email ueber Debian Sendmail senden
# wird direkt ueber Zarafa verschickt.
#
# 20.07.2013 MBS
#
# define Sonstiges notify Fenster:Window:.*,.*Low.Batt*. {\
# DebianMail('email@@email.domain','Subject','Text');;\
# } 
#
##########################################################################################################################
{
my $rcpt = "info\@bayerschmidt.com";
my $subject = shift;
my $text = shift;
my $ret = "";
my $sender = "raspi\@bayerschmidt.com";
my $konto = "xxxxxxxx";
my $passwrd = "xxxxxx";
my $provider = "192.168.200.40";
#log 1, "sendEmail RCP: $rcpt";
#log 1, "sendEmail Subject: $subject";
#log 1, "sendEmail Text: $text";

$ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -s '$provider' -xu '$konto' -xp '$passwrd' -o tls=no);
$ret =~ s,[\r\n]*,,g; #remove CR from return string
#log 1, "sendEmail returned: $ret";
}


sub I2Crun($$)
##########################################################################################################################
#
# Check ob der Prozess I2C_fhem läuft.
# 
# 23.07.2013 MBS
# Uebergabe: $_[0] = Pfad zum Prozess 
#            $_[1] = Dummy fuer FHEM     
##########################################################################################################################
{
my $PCO_status = qx(/etc/init.d/$_[0] status);
my $PCO_stop = "$_[0] is not running";
my $PCO_run = "$_[0] is running";
my $dum_stat = ReadingsVal($_[1],"state","stop");
chomp($PCO_status); 

	if($PCO_status eq $PCO_run)
	{
		###  is running = OK
		if ($dum_stat ne "run")
		{
			fhem("set $_[1] run");
		}
	}
	else
	{
		### is stopped  = Start again
		if ($dum_stat ne "stop")
		{
			fhem("set $_[1] stop");
			system"/etc/init.d/$_[0] start";
		}
	}
}

sub Zisterne($)
###########################################################################################################################
#
# Berechung der Zisternen Daten
#
# 20.08.2013 MBS
# Uebergabe: $_[0] = Dummy Distanze
#
#
# FHEM Variablen: dum_SRF10_pro
#                 dum_SRF10_vol
#
###########################################################################################################################
{
my $r = 110/100;                 ### Radius Zisterne
my $h = 160/100;                 ### Hoehe Zisterne
my $Pi = 3.14;  
my $w = 15/100;                ### Distanz zwischen Reader und Wasseroberflaeche max
my $m = ($r*$r)*$h*$Pi ;       ### Volumen gesamt   
my $sensor = (ReadingsVal($_[0],"state","100")/100)-$w;  ### Messwert Senor aufbereitet
my $m1 = ($r*$r)*$sensor*$Pi ; ### Volumen welches mit Luft gefuellt ist
my $Fuellvolumen = $m-$m1;     ### Volumen gesamt - Volumen Luft
my $Fuellprozent = ($Fuellvolumen*100)/$m ;
my $Wasserstand = (($h-$sensor)*100);

#print $sensor;
#print " \n";
#print $m1;
#print " \n";
#print $m ;
#print" \n";

fhem("set dum_SRF10_pro ".$Fuellprozent);
fhem("set dum_SRF10_vol ".$Fuellvolumen);
fhem("set dum_SRF10_fue ".$Wasserstand);
}
